package com.linln.common.utils;

import com.baidu.unbiz.fluentvalidator.FluentValidator;
import com.baidu.unbiz.fluentvalidator.Result;
import com.baidu.unbiz.fluentvalidator.ValidatorHandler;
import com.baidu.unbiz.fluentvalidator.ValidatorContext;
import com.baidu.unbiz.fluentvalidator.ResultCollectors;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

import com.baidu.unbiz.fluentvalidator.FluentValidator;
import com.baidu.unbiz.fluentvalidator.Result;
import com.baidu.unbiz.fluentvalidator.ValidatorHandler;
import com.baidu.unbiz.fluentvalidator.ValidatorContext;
import com.baidu.unbiz.fluentvalidator.ResultCollectors;

import java.util.List;
import java.util.function.Predicate;

import com.baidu.unbiz.fluentvalidator.FluentValidator;
import com.baidu.unbiz.fluentvalidator.Result;
import com.baidu.unbiz.fluentvalidator.ValidatorHandler;
import com.baidu.unbiz.fluentvalidator.ValidatorContext;
import com.baidu.unbiz.fluentvalidator.ResultCollectors;

import java.util.List;
import java.util.function.Predicate;

public class ValidationUtil {

    // 泛型类 ValidationRule，指定具体的类型 T
    public static class ValidationRule<T> {
        private T field;
        private Predicate<T> predicate;
        private String errorMessage;

        public ValidationRule(T field, Predicate<T> predicate, String errorMessage) {
            this.field = field;
            this.predicate = predicate;
            this.errorMessage = errorMessage;
        }

        public T getField() {
            return field;
        }

        public Predicate<T> getPredicate() {
            return predicate;
        }

        public String getErrorMessage() {
            return errorMessage;
        }
    }

    // 使用通配符 <?> 来支持不同类型
    public static Result validateFields(List<ValidationRule<?>> rules) {
        FluentValidator validator = FluentValidator.checkAll().failFast();

        for (ValidationRule<?> rule : rules) {
            validator.on(rule.getField(), new ValidatorHandler<Object>() {
                @Override
                public boolean validate(ValidatorContext context, Object value) {
                    // 使用通配符时需要强制转换为通用类型
                    @SuppressWarnings("unchecked")
                    Predicate<Object> predicate = (Predicate<Object>) rule.getPredicate();
                    if (!predicate.test(value)) {
                        context.addErrorMsg(rule.getErrorMessage());
                        return false;
                    }
                    return true;
                }
            });
        }

        return validator.doValidate().result(ResultCollectors.toSimple());
    }




}